package net;

import irc.IrcClient;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * Klasa zajmująca się połaczeniem i warstwą kontaku z serwerem irc.
 * Działa jako osobny wątek.
 * Jeden wątek - jedno połączenie.
 * @author adrian
 */
public final class Connector extends Thread {

    private Socket socket = null;
    private Reader reader;
    private IrcClient irc = null;
    private BufferedWriter writer;

    /**
     * Tworzy nowy wątek połączenia z serwerem.
     * @param adr String adres serwera.
     * @param port int numer portu.
     */
    public Connector(String adr, int port, IrcClient ic) {
        irc = ic;
        try {
            socket = new Socket(adr, port);
            reader = new Reader(this);
            reader.start();
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        } catch (UnknownHostException ex) {
            System.err.print(ex);
        } catch (IOException ex) {
            System.err.print(ex);
        }
    }             

    /**
     * Zamyka połączenie
     */
    public void disconnect() {
        try {
            socket.close();
        } catch (IOException ex) {
            System.err.print(ex);
        }
    }

    /**
     * Pobiera referencję do gniazda
     * @return Gniazdo 
     */
    Socket getSocket() {
        return socket;
    }
    
    /**
     * Zwraca referencję do klienta irc
     * (tylko w pakiecie)
     * @return IrcClient
     */
    IrcClient getIrcClient(){
        return irc;
    }
   

    /**
     * Funkcja przyjmuje jako parametr String i wysyła do serwera wiadomość
     * ZAWSZE NA KOŃCU LINII DODAWANY JEST \n
     * @param cmd
     * @exception ex IOException wyjątek wygnerowany w razie niepowodzenia wysłania danych do serwera.
     */
    public void sendToServer(String cmd) throws IOException {
        writer.write(cmd+"\n");
        writer.flush();
    }
}
